home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swaga_c.zip / CRT.SWG / 0010_GUI - CRT Replacement.pas < prev    next >
Pascal/Delphi Source File  |  1993-09-26  |  15KB  |  710 lines

  1. (*
  2. ===========================================================================
  3.  BBS: Beta Connection
  4. Date: 09-21-93 (09:28)             Number: 2846
  5. From: ROBERT ROTHENBURG            Refer#: 2648
  6.   To: GAYLE DAVIS                   Recvd: YES (PVT)
  7. Subj: SWAG Submission  (Part 1)      Conf: (232) T_Pascal_R
  8. ---------------------------------------------------------------------------
  9. ->#643
  10.  
  11. Gayle,
  12.  
  13.         Here's the GUI Unit I mentioned that I would submit for the SWAG
  14.         reader a while back.
  15.  
  16.         There's no documentation and a few things could be touched up,
  17.         but it works.
  18.  
  19. *)
  20.  
  21. Unit GUI; (* Video and GUI Routines *)
  22.  
  23. Interface
  24.  
  25. Const
  26.   NormalCursor = $0D0E; (* Might be different on some systems *)
  27.   BlankCursor  = $2000;
  28.  
  29. Type
  30.   ScrBuffer   = Array [0..1999] Of Word; (* Screen Buffer *)
  31.  
  32. Var
  33.   DirectVideoGUI: Boolean; (* define as TRUE if direct-video writing *)
  34.   Screen: Array [0..7] Of ScrBuffer Absolute $B800: 0000;
  35.  
  36. Procedure SetActivePage (Page: Byte);
  37. Procedure ScrollWindowUp (NoLines, Attrib, ColUL, RowUL, ColLR, RowLR: Byte);
  38. Procedure ScrollWindowDn (NoLines, Attrib, ColUL, RowUL, ColLR, RowLR: Byte);
  39. Procedure HLineCharAttrib (Page: Byte; CharAttrib: Word; xFrom, xTo, Y: Byte);
  40. Procedure VLineCharAttrib (Page: Byte; CharAttrib: Word; X, yFrom, yTo: Byte);
  41. Function  GetCharAttribXY (Page, X, Y: Byte): Word;
  42. Function  GetCharAttrib (Page: Byte): Word;
  43. Procedure PutCharAttrib (Page: Byte; CharAttrib: Word; NoChar: Word);
  44. Procedure WriteChar (Page: Byte; CharAttrib: Word; NoChar: Word);
  45. Procedure CWriteXY (Page, attrib, X, Y: Byte; n: String);
  46. Procedure WriteXY (Page, attrib, X, Y: Byte; Var n: String);
  47. Procedure WriteXYCh (Page, attrib, X, Y, c: Byte);
  48. Procedure SetCursorPos (Page, Column, Row: Byte);
  49. Procedure GetCursorPos (Var Page, Column, Row: Byte);
  50. Procedure SetCursorType (ctype: Word);
  51. Function  GetCursorType (Page: Byte): Word;
  52.  
  53. Procedure InitDirect;
  54. Procedure SavScr (Page: Byte; Var S: ScrBuffer);
  55. Procedure ResScr (Page: Byte; Var S: ScrBuffer);
  56.  
  57. Function  GetKeyCode: Word; (* Wait for Key from Buffer *)
  58. Function  GetKeyFlags: Byte;
  59. Function  PollKey (Var Status: Word): Word;
  60. Function  GetKeyStroke: Word;  (* Enhanced Keyboard? *)
  61. Function  CheckKeyBoard: Word; (* Enhanced Keyboard? *)
  62. Procedure WriteKey (KeyCode: Word; Var Status: Byte);
  63.  
  64. Procedure WaitOnUser (Var Code, X, Y, Button: Word);
  65. Function  InitMouse: Word;
  66. Procedure ShowMouseCursor;
  67. Procedure HideMouseCursor;
  68. Procedure SetMouseWindow (X1, Y1, X2, Y2: Word);
  69. Procedure GetMousePos (Var X, Y, button: Word);
  70. Procedure SetMousePos (X, Y: Word);
  71. Procedure GetButtonPressInfo (Var X, Y, Button, NumberOfPresses: Word);
  72. Procedure GetButtonRelInfo (Var X, Y, Button, NumberOfReleases: Word);
  73.  
  74. Procedure Frame (Page, X1, Y1, X2, Y2, c: Byte; Title: String);
  75. Procedure Shadow (Page, X1, Y1, X2, Y2, cc: Byte);
  76. Procedure FHLine (Page, Attrib, xFrom, xTo, Y: Byte);
  77. Procedure FVLine (Page, Attrib, X, yFrom, yTo: Byte);
  78. Procedure FrameReadLN (Var T: String; Page, X1, Y1, X2, Y2, cc: Byte);
  79. Procedure Dialogue (Var T: String; Page, X1, Y1, X2, Y2, cc: Byte; Title: String);
  80.  
  81. IMPLEMENTATION
  82.  
  83. uses DOS;
  84.  
  85. Const
  86.   NUL    = #00;
  87.   DEL    = #08;
  88.   LF     = #10;
  89.   CR     = #13;
  90.   SP     = #32;
  91.  
  92.   VIO    = $10;  (* BIOS Video Interrupt *)
  93.   KBIO   = $16;  (* BIOS Keyboard        *)
  94.   MIO    = $33;  (* Mouse Services       *)
  95. Var X, Y: Word;
  96.     reg: registers;
  97.     DTemp: ScrBuffer;
  98.  
  99. function x80(y: word): word;
  100. begin
  101.   asm
  102.     MOV AX,y
  103.     MOV BX,AX
  104.     MOV CL,4
  105.     SHL BX,CL
  106.     MOV CL,6
  107.     SHL AX,CL
  108.     ADD AX,BX
  109.     MOV @Result, AX
  110.   end
  111. end;
  112.  
  113. function x80p(y,x: word): word;
  114. begin
  115.   asm
  116.     MOV AX,y
  117.     MOV BX,AX
  118.     MOV CL,4
  119.     SHL BX,CL
  120.     MOV CL,6
  121.     SHL AX,CL
  122.     ADD AX,BX
  123.     ADD AX,x
  124.     MOV @Result, AX
  125.   end
  126. end;
  127.  
  128. Procedure WriteChar (Page: Byte; CharAttrib: Word; NoChar: Word);
  129. Begin
  130.   Asm
  131.     MOV AX, CharAttrib
  132.     MOV BL, AH
  133.     MOV AH, $0A
  134.     MOV BH, Page
  135.     MOV CX, NoChar
  136.     Int VIO
  137.   End;
  138. End;
  139.  
  140. Procedure PutCharAttrib (Page: Byte; CharAttrib: Word; NoChar: Word);
  141. Begin
  142.   Asm
  143.     MOV AX, CharAttrib
  144.     MOV BL, AH
  145.     MOV AH, $09
  146.     MOV BH, Page
  147.     MOV CX, NoChar
  148.     Int VIO
  149.   End;
  150. End;
  151.  
  152. Function GetCharAttrib (Page: Byte): Word;
  153. Begin
  154.   Asm
  155.     MOV AH, $08
  156.     MOV BH, Page
  157.     Int VIO
  158.     MOV @Result, AX
  159.   End;
  160. End;
  161.  
  162. Procedure InitDirect; (* CRT uses the variable "DirectVideo"... *)
  163. Begin
  164.   DirectVideoGUI := True
  165. End;
  166.  
  167. Function GetCharAttribXY (Page, X, Y: Byte): Word;
  168. Begin
  169.   If DirectVideoGUI
  170.   Then GetCharAttribXY := Screen [Page] [ x80p(Y,X)]
  171.   Else Begin
  172.     Asm
  173.       MOV AH, $02
  174.       MOV BH, Page
  175.       MOV DH, Y
  176.       MOV DL, X
  177.       Int VIO
  178.       MOV AH, $08
  179.       MOV BH, Page
  180.       Int VIO
  181.       MOV @Result, AX
  182.     End
  183.   End;
  184. End;
  185.  
  186. Procedure ScrollWindowUp (NoLines, Attrib, ColUL, RowUL, ColLR, RowLR: Byte);
  187.   Assembler;
  188. Asm
  189.   MOV AH, $06
  190.   MOV AL, NoLines
  191.   MOV BH, Attrib
  192.   MOV CH, RowUL
  193.   MOV CL, ColUL
  194.   MOV DH, RowLR
  195.   MOV DL, ColLR
  196.   Int VIO
  197. End;
  198.  
  199. Procedure ScrollWindowDn (NoLines, Attrib, ColUL, RowUL, ColLR, RowLR: Byte);
  200. Begin
  201.   Asm
  202.     MOV AH, $07
  203.     MOV AL, NoLines
  204.     MOV BH, Attrib
  205.     MOV CH, RowUL
  206.     MOV CL, ColUL
  207.     MOV DH, RowLR
  208.     MOV DL, ColLR
  209.     Int VIO
  210.   End;
  211. End;
  212.  
  213. Procedure SetActivePage (Page: Byte); Assembler;
  214. Asm
  215.   MOV AH, $05
  216.   MOV AL, Page
  217.   Int VIO
  218. End;
  219.  
  220. Procedure GetCursorPos (Var Page, Column, Row: Byte);
  221. Var p, X, Y: Byte;
  222. Begin
  223.   p := Page;
  224.   Asm
  225.     MOV AH, $03
  226.     MOV BH, p
  227.     Int VIO
  228.     MOV p, BH
  229.     MOV X, DL
  230.     MOV Y, DH
  231.   End;
  232.   Page := p;
  233.   Column := X;
  234.   Row := Y;
  235. End;
  236.  
  237. Function GetCursorType (Page: Byte): Word;
  238. Begin
  239.   Asm
  240.     MOV AH, $03;
  241.     MOV BH, Page
  242.     Int VIO
  243.     MOV @Result, CX
  244.   End;
  245. End;
  246.  
  247. Procedure SetCursorPos (Page, Column, Row: Byte);
  248. Begin
  249.   Asm
  250.     MOV AH, $02
  251.     MOV BH, Page
  252.     MOV DH, Row
  253.     MOV DL, Column
  254.     Int VIO
  255.   End;
  256. End;
  257.  
  258. Procedure SetCursorType (ctype: Word);
  259. Begin
  260.   Asm
  261.     MOV AH, $01
  262.     MOV CX, ctype
  263.     Int VIO
  264.   End;
  265. End;
  266.  
  267. Procedure WriteXYCh (Page, attrib, X, Y, c: Byte);
  268. Begin
  269.   If DirectVideoGUI
  270.   Then Screen [Page] [ x80p(Y,X) ] :=
  271.     (attrib ShL 8) + c
  272.   Else Begin
  273.     Asm
  274.       MOV AH, $02
  275.       MOV BH, Page
  276.       MOV DL, X
  277.       MOV DH, Y
  278.       Int VIO
  279.       MOV AL, c
  280.       MOV BL, Attrib
  281.       MOV AH, $09
  282.       MOV CX, 1
  283.       Int VIO
  284.     End
  285.   End
  286. End;
  287.  
  288. Procedure WriteXY (Page, attrib, X, Y: Byte; Var n: String);
  289. Var i: byte;
  290. Begin
  291.   If n [0] <> #0
  292.   Then If DirectVideoGUI
  293.   Then Begin
  294.     For i := 1 To Length (n)
  295.     Do Screen [Page] [ x80p(Y,X+Pred (i)) ] := (attrib ShL 8) + Ord (n [i] );
  296.   End
  297.   Else Begin
  298.    for i:=1 to Length(n)
  299.     do
  300.      WriteXYCh(Page,Attrib,X+pred(i),y,ord(n[i]));
  301. End
  302. End;
  303.  
  304. Procedure CWriteXY (Page, attrib, X, Y: Byte; n: String);
  305. Begin
  306.   WriteXY (Page, attrib, X, Y, n);
  307. End;
  308.  
  309. Procedure HLineCharAttrib (Page: Byte; CharAttrib: Word; xFrom, xTo, Y: Byte);
  310. Begin
  311.   If DirectVideoGUI
  312.   Then For X := x80p(Y, xFrom) To x80p(Y, xTo)
  313.     Do Screen [Page] [X] := CharAttrib
  314.   Else Begin
  315.     SetCursorPos (Page, xFrom, Y);
  316.     PutCharAttrib (Page, CharAttrib, (xTo - xFrom) + 1)
  317.   End
  318. End;
  319.  
  320. Procedure VLineCharAttrib (Page: Byte; CharAttrib: Word; X, yFrom, yTo: Byte);
  321. Var Y: Byte;
  322. Begin
  323.   For Y := yFrom To yTo
  324.   Do If DirectVideoGUI
  325.   Then Screen [Page] [ x80p(Y, X)] := CharAttrib
  326.   Else Begin
  327.     SetCursorPos (Page, X, Y);
  328.     PutCharAttrib (Page, CharAttrib, 1)
  329.   End
  330. End;
  331.  
  332. Procedure Frame (Page, X1, Y1, X2, Y2, c: Byte; Title: String);
  333. Begin
  334.   ScrollWindowUP (0, c, X1, Y1, X2, Y2); (* Must be on correct Page! *)
  335.   For X := X1 To X2
  336.   Do Begin
  337.     WriteXYCh (Page, c, X, Y1, 196);
  338.     WriteXYCh (Page, c, X, Y2, 196)
  339.   End;
  340.   For Y := Y1 To Y2
  341.   Do Begin
  342.     WriteXYCh (Page, c, X1, Y, 179);
  343.     WriteXYCh (Page, c, X2, Y, 179)
  344.   End;
  345.   WriteXYCh (Page, c, X1, Y1, 218);
  346.   WriteXYCh (Page, c, X2, Y1, 191);
  347.   WriteXYCh (Page, c, X1, Y2, 192);
  348.   WriteXYCh (Page, c, X2, Y2, 217);
  349.   If title <> ''
  350.   Then CWriteXY (Page, c, ( (X2 - X1) - (Length (title) + 2) ) Div 2, Y1, SP+Title);
  351. End;
  352.  
  353. Procedure FHLine (Page, Attrib, xFrom, xTo, Y: Byte);
  354. Begin
  355.   HLineCharAttrib (Page, (Attrib ShL 8) + 196, Succ (xFrom), Pred (xTo), Y);
  356.   WriteXYCh (Page, Attrib, xFrom, Y, 195);
  357.   WriteXYCh (Page, Attrib, xTo, Y, 180);
  358. End;
  359.  
  360. Procedure FVLine (Page, Attrib, X, yFrom, yTo: Byte);
  361. Begin
  362.   VLineCharAttrib (Page, (Attrib shl 8) + 179, X, Succ (yFrom), Pred (yTo) );
  363.   WriteXYCh (Page, Attrib, X, yFrom, 194);
  364.   WriteXYCh (Page, Attrib, X, yTo, 193);
  365. End;
  366.  
  367.  
  368. Procedure SavScr (Page: Byte; Var S: ScrBuffer);
  369. Begin
  370.   If DirectVideoGUI
  371.   Then Move (Screen, S [Page], 4000)
  372.   Else
  373.     asm
  374.       MOV DL, 79
  375. @I1:  MOV DH, 24
  376. @I0:  MOV BH, Page
  377.       MOV AH,02
  378.       INT VIO
  379.       MOV AH,08
  380.       INT VIO
  381.  
  382.       XCHG AX, DI
  383.       XOR AX, AX
  384.       MOV AL, DH
  385.       MOV BX, AX
  386.       MOV CL,4
  387.       SHL BX,CL
  388.       MOV CL,6
  389.       SHL AX,CL
  390.       ADD AX,BX
  391.       CLC
  392.       ADD AL,DL
  393.       ADC AH,00
  394.       SHL AX,1
  395.       LDS SI, S
  396.       ADD SI,AX
  397.  
  398.       XCHG AX, DI
  399.       MOV WORD PTR [SI],AX
  400.       DEC DH
  401.       CMP DH,-1
  402.       JNE @I0
  403.       DEC DL
  404.       CMP DL,-1
  405.       JNE @I1
  406.     end;
  407. End;
  408.  
  409. Procedure ResScr (Page: Byte; var S: ScrBuffer);
  410. Begin
  411.   If DirectVideoGUI
  412.   Then Move (S, Screen [Page], 4000)
  413.   Else
  414.     asm
  415.       MOV DL, 79
  416. @I1:  MOV DH, 24
  417. @I0:  MOV BH, Page
  418.       MOV AH,02
  419.       INT VIO
  420.       XOR AX, AX
  421.       MOV AL, DH
  422.       MOV BX, AX
  423.       MOV CL,4
  424.       SHL BX,CL
  425.       MOV CL,6
  426.       SHL AX,CL
  427.       ADD AX,BX
  428.       CLC
  429.       ADD AL,DL
  430.       ADC AH,00
  431.       SHL AX,1
  432.  
  433.       LDS SI, S
  434.       ADD SI,AX
  435.  
  436.       MOV AX,WORD PTR [SI]
  437.       MOV BL, AH
  438.       MOV BH, Page
  439.       MOV AH, 09
  440.       MOV CX, 1
  441.       int VIO
  442.       DEC DH
  443.       CMP DH,-1
  444.       JNE @I0
  445.       DEC DL
  446.       CMP DL,-1
  447.       JNE @I1
  448.     end;
  449. End;
  450.  
  451. Function GetKeyCode: Word;
  452. Begin
  453.   Asm
  454.     MOV AH, $00
  455.     Int KBIO
  456.     MOV @Result, AX
  457.   End;
  458. End;
  459.  
  460. Function PollKey (Var Status: Word): Word;
  461. var s: word;
  462. Begin
  463.   asm
  464.     MOV AH, 01
  465.     INT KBIO
  466.     MOV @Result, AX
  467.     LAHF
  468.     AND AX, 64
  469.     MOV S, AX
  470.   end;
  471.   Status:=s;
  472. End;
  473.  
  474. Function GetKeyStroke: Word;
  475. Begin
  476.   Asm
  477.     MOV AH, $10
  478.     Int KBIO
  479.     MOV @Result, AX
  480.   End;
  481. End;
  482.  
  483. Function CheckKeyBoard: Word;
  484. Begin
  485.   Asm
  486.     MOV AH, $11
  487.     Int KBIO
  488.     MOV @Result, AX
  489.   End;
  490. End;
  491.  
  492. Function GetKeyFlags: Byte;
  493. Begin
  494.   Asm
  495.     MOV AH, $02
  496.     Int KBIO
  497.     MOV @Result, AL
  498.   End;
  499. End;
  500.  
  501. Function GetKeyStatus: Word;
  502. Begin
  503.   Asm
  504.     MOV AH, $12
  505.     Int KBIO
  506.     MOV @Result, AX
  507.   End;
  508. End;
  509.  
  510. Procedure WriteKey (KeyCode: Word; Var Status: Byte);
  511. Var s: Byte;
  512. Begin
  513.   Asm
  514.     MOV AH, $05
  515.     MOV CX, KeyCode
  516.     Int KBIO
  517.     MOV s, AL
  518.   End;
  519.   Status := s;
  520. End;
  521.  
  522. Procedure WaitOnUser (Var Code, X, Y, Button: Word);
  523.  (* wait for key or mouse click *)
  524. Var Status: Word;
  525. Begin
  526.   Repeat
  527.     Code := PollKey (Status);
  528.     GetMousePos (X, Y, Button);
  529.   Until (Button <> 0) Or (Status = 0);
  530. End;
  531.  
  532. Function InitMouse: Word;
  533. Begin
  534.   Asm
  535.     MOV AX, $0000
  536.     Int MIO
  537.     MOV @Result, AX
  538.   End;
  539. End;
  540.  
  541. Procedure ShowMouseCursor; Assembler;
  542. Asm
  543.   MOV AX, $0001
  544.   Int MIO
  545. End;
  546.  
  547. Procedure HideMouseCursor; Assembler;
  548. Asm
  549.   MOV AX, $0002
  550.   Int MIO
  551. End;
  552.  
  553. Procedure GetMousePos (Var X, Y, Button: Word);
  554. Var X1, Y1, b: Word;
  555. Begin
  556.   Asm
  557.     MOV AX, $0003
  558.     Int MIO
  559.     MOV b,  BX
  560.     MOV X1, CX
  561.     MOV Y1, DX
  562.   End;
  563.   X := X1;
  564.   Y := Y1;
  565.   Button := b;
  566. End;
  567.  
  568. Procedure SetMousePos (X, Y: Word); Assembler;
  569. Asm
  570.   MOV AX, $0004
  571.   MOV CX, X
  572.   MOV DX, Y
  573.   Int MIO
  574. End;
  575.  
  576. Procedure GetButtonPressInfo (Var X, Y, Button, NumberOfPresses: Word);
  577. Begin
  578.   reg. AX := $0005;
  579.   reg. BX := Button;
  580.   Intr (MIO, reg);
  581.   Button := reg. AX;
  582.   X := reg. CX;
  583.   Y := reg. DX;
  584.   NumberOfPresses := reg. BX
  585. End;
  586.  
  587. Procedure GetButtonRelInfo (Var X, Y, Button, NumberOfReleases: Word);
  588. Begin
  589.   reg. AX := $0006;
  590.   reg. BX := Button;
  591.   Intr (MIO, reg);
  592.   Button := reg. AX;
  593.   X := reg. CX;
  594.   Y := reg. DX;
  595.   NumberOfReleases := reg. BX
  596. End;
  597.  
  598. Procedure SetMouseWindow (X1, Y1, X2, Y2: Word);
  599. Begin
  600.   reg. AX := $0007;
  601.   reg. CX := X1;
  602.   reg. DX := X2;
  603.   Intr ($33, reg);
  604.   Inc (reg. AX, 1);
  605.   reg. CX := Y1;
  606.   reg. DX := Y2;
  607.   Intr (MIO, reg)
  608. End;
  609.  
  610.  
  611. Procedure Shadow (Page, X1, Y1, X2, Y2, cc: Byte);
  612. Begin
  613.   HLineCharAttrib (Page, (cc * $100) + $B1, Succ (X1), Succ (X2), Succ (Y2) );
  614.   VLineCharAttrib (Page, (cc * $100) + $B1, Succ (X2), Succ (Y1), Succ (Y2) );
  615. End;
  616.  
  617. Procedure Dialogue (Var T: String; Page, X1, Y1, X2, Y2, cc: Byte; Title: String);
  618. Begin
  619.   SavScr (Page, DTemp);
  620.   Frame (Page, X1, Y1, X2, Y2, cc, ''); Title := SP + Title + SP;
  621.   WriteXY (Page, cc, Succ (X1), Y1, Title);
  622.   FrameReadLN (T, Page, Succ (X1), Succ (Y1), Pred (X2), Pred (Y2), cc);
  623.   ResScr (Page, DTemp)
  624. End;
  625.  
  626. Procedure FrameReadLN (Var T: String; Page, X1, Y1, X2, Y2, cc: Byte);
  627. Var i, X, Y, z: Byte;
  628.   Code: Word;
  629.   C: Char;
  630. Begin
  631.   X := X1; Y := Y1;
  632.   If T [0] <> #0
  633.   Then For i := 0 To Pred (Ord (T [0] ) )
  634.     Do WriteXYCh (Page, cc, (i Mod (X2 - X1) ) + X1, (i Div (X2 - X1) ) + Y1, Ord(T[0]));
  635.   SetCursorType (NormalCursor);
  636.   i := 0;
  637.   Repeat
  638.     SetCursorPos (Page, X, Y);
  639.     Code := GetKeyCode;
  640.     C := Chr (Lo (Code) );
  641.     If C = NUL
  642.     Then Begin
  643.       Case Hi (Code) Of
  644.         $4B: If i <> 0 Then Dec (i);
  645.         $4D: If i < Ord (T [0] ) Then Inc (i);
  646.         $47: i := 0;
  647.         $4F: i := Ord (T [0] );
  648.         {   $53:if i<ord(T[0]) then begin
  649.         if i>1
  650.         then T:=Copy(T,1,pred(i))+Copy(T,succ(i),255)
  651.         else if i<>ord(T[0])
  652.         then T:=Copy(T,2,255)
  653.         else T:=Copy(T,1,pred(i));
  654.         for z:=i to ord(T[0])
  655.         do WriteXY(Page,cc,(z mod (x2-x1))+x1,(z div (x2-x1))+y1,T[z]);
  656.         WriteXY(Page,cc,(succ(z) mod (x2-x1))+x1,
  657.         (succ(z) div (x2-x1))+y1,SP);
  658.         end;    }
  659.       End;
  660.       X := (i Mod (X2 - X1) ) + X1;
  661.       Y := (i Div (X2 - X1) ) + Y1
  662.     End
  663.     Else If C <> CR
  664.     Then If (i < 255) And (Y <= Y2)
  665.     Then If C <> DEL
  666.     Then Begin
  667.       Inc (i);
  668.       T [i] := C;
  669.       If i > Ord (T [0] )
  670.       Then Inc (T [0], 1);
  671.       WriteXYCh (Page, cc, X, Y, Ord (C) );
  672.       Inc (X);
  673.       If X = X2
  674.       Then Begin
  675.         Inc (Y);
  676.         X := X1
  677.       End
  678.     End
  679.     Else If (i <> 0) And (i = Ord (T [0] ) )
  680.     Then Begin
  681.       {  if i<ord(T[0])
  682.       then T:=Copy(T,1,pred(i))+Copy(T,succ(i),255);}
  683.       Dec (i);
  684.       Dec (T [0], 1);
  685.       If X = X1
  686.       Then Begin
  687.         X := Pred (X2);
  688.         Dec (Y)
  689.       End
  690.       Else Dec (X);
  691.       If i = Ord (T [0] )
  692.       Then WriteXYCh (Page, cc, X, Y, 32)
  693.         {   else begin
  694.         for z:=i to ord(T[0])
  695.         do WriteXY(Page,cc,(z mod (x2-x1))+x1,(z div (x2-x1))+y1,T[z]);
  696.         WriteXY(Page,cc,(succ(z) mod (x2-x1))+x1,
  697.         (succ(z) div (x2-x1))+y1,SP);
  698.         x:=(i mod (x2-x1))+x1;
  699.         y:=(i div (x2-x1))+y1
  700.         end  }
  701.     End
  702.   Until C = CR;
  703.   SetCursorType (BlankCursor);
  704. End;
  705.  
  706. End.
  707. ---
  708.  * Your Software Resource * Selden NY * 516-736-6662
  709.  * PostLink(tm) v1.07  YOURSOFTWARE (#5190) : RelayNet(tm)
  710.